package com.cskaoyan.javase.method._0introduction;

/**
 * 使用方法复用代码
 *
 * 一般情况下，定义一个方法是以下语法结构：
 * [修饰符列表] 返回值类型 方法名 (形式参数列表){
 *   // 方法体
 * }
 *
 * 在具体了解每个部分的语义之前，我们需要了解两个非常重要的概念：
 *      1.方法的声明/方法头
 *      指的是 "[修饰符列表] 返回值类型 方法名 (形式参数列表)"
 *
 *      2.方法的签名
 *      指的是 "方法名 (形式参数列表)"
 *      方法的签名用于唯一的确定一个方法.
 *
 * 下列详细 讲解一下方法语法的每个部分:
 *      1.[修饰符列表]: 修饰符组成的列表,在Java中能够用来修饰方法的修饰符很多,它们都是关键字.
 *              目前,我们没有学习任何修饰符
 *              所以现在先默认方法的修饰符列表是public static(和main方法保持一致)
 *              注: 方法并不是必须要有修饰符,方法可以不要任何修饰符.
 *
 *      2.返回值类型,指的是返回值的数据类型,可以是基本数据类型,也可以是引用数据类型
 *          返回值: 方法通过一系列代码的执行,有可能会给出一个结果,那么返回值就是这个结果
 *              返回值就是方法传递给外界的一个计算结果.
 *
 *
 *      3.方法名,是一个标识符,它要遵循小驼峰式的命名规范
 *          给方法起名字,核心追求是"见名知意"
 *          应该赋予方法一个有含义的,合法的英文名字
 *          由于方法往往做一些操作,方法名建议带动词
 *          比如一个求和的方法,就可以叫"getSum"或者就叫"sum"
 *          特别强调: 严禁使用类似于a,b,c这种偷懒的命名
 *
 *
 *      4.形式参数列表,指的是由形式参数组成的列表.
 *          方法有时需要传入参数才能够正常执行,那么到底传入几个参数,传入的参数是什么类型,这些都要依赖于形式参数
 *          形式参数: 规定了方法调用时,需要传入几个参数,以及参数的数据类型
 *              语法: 数据类型 形参名 多个形参用","隔开
 *              思考:
 *              a.形式参数(形参)可以没有吗?
 *                  可以没有,没有形参的方法是无参方法,意味着调用它无需传入参数,可以直接调用.
 *              b.形式参数是一个真正意义上的参数(数据)吗?
 *                  不是,形参不是一个真正的参数,它只是一个占位符,它表示调用方法需要传入什么参数而已
 *
 *          实际参数: 在具体调用方法时,传递给方法的参数,称之为实际参数,简称实参
 *          在定义方法时,写在方法语法中的参数是形参,在调用方法时,写在方法调用时的参数,是实参参数
 *
 *      5.方法体,就是方法执行的语句,可以随便写,也可以是空的不写.(根据具体情况而定)
 *
 * 方法的定义:
 *      1.定义位置: 定义在类体中,但方法不能嵌套定义.
 *      2.如果一个方法明确在返回值类型中指出了该方法的返回值类型,那么就意味着该方法必须在方法体给出返回值
 *      语法:
 *          return + 值/表达式/..;
 *
 * 方法的调用:
 *      1.在任何Java程序当中,main方法都是入口方法
 *          一个方法/一段代码,要想被执行
 *          那么它要么直接在main方法中被调用
 *          要么在main方法中间接调用
 *          方法不调用不执行,必须要直接/间接调用才行!
 *
 *      2.如何调用呢?
 *          对于同类中的,带有"static"修饰的方法
 *          在main方法中,可以直接使用方法名调用它
 *          其他的,传入实参等照旧.
 *
 *      3.操作方法的调用,其实就是操作方法的返回值
 *      (当然,前提是方法得有返回值)
 *
 * 注意事项：
 *      1.方法的定义位置对方法的调用是没有影响的。
 *          同一个类当中，各个方法之间是平行的关系
 *          无论定义在什么位置不影响调用
 *
 *      2.对于修饰符列表中存在static修饰的方法
 *          在同一个类中可以用方法名互相调用
 *          不受影响。
 *
 *      3.对于方法而言，方法体中定义的变量以及形式参数，它们都属于方法内部的局部变量。
 *      仅在方法内部生效。
 *
 * @since 14:53
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class NewDemo {
    public static void main(String[] args) {
        /*// Result of 'NewDemo.sum()' is ignored
        // sum(10, 20);
        // 建议对有返回值的方法,要接收处理它的返回值
        // 1.接收返回值
        int sumValue = sum(1, 1);
        System.out.println(sumValue);

        // 2.直接使用返回值
        System.out.println(sum(10, 10));
        System.out.println(sum(20, 20) + 20);
        System.out.println(sum(30, 30) * 30);

        int num1 = 100;
        int num2 = 200;
        System.out.println(sum(num1, num2));*/

        System.out.println(sum(10, 10));
    }

    // 需求: 写一个方法用于求两个int数值的和
    public static int sum(int num1, int num2) {
        // Missing return statement
        // Local variable 'sumValue' is redundant
        // int sumValue = num1 + num2;
        System.out.println(getStr());
        return num1 + num2;
    }

    public static String getStr() {
        return "abc";
        // Unreachable statement
        // System.out.println();
    }
}
